import store from '@/store'
import url from '@/utils/url'

export function checkConflict(files, items) {
  if (typeof items === 'undefined' || items === null) {
    items = []
  }

  let folder_upload = files[0].fullPath !== undefined

  let conflict = false
  for (let i = 0; i < files.length; i++) {
    let file = files[i]
    let name = file.name

    if (folder_upload) {
      let dirs = file.fullPath.split("/")
      if (dirs.length > 1) {
        name = dirs[0]
      }
    }

    let res = items.findIndex(function hasConflict(element) {
      return (element.name === this)
    }, name)

    if (res >= 0) {
      conflict = true
      break
    }
  }

  return conflict
}

export function scanFiles(dt) {
  return new Promise((resolve) => {
    let reading = 0
    const contents = []

    if (dt.items !== undefined) {
      for (let item of dt.items) {
        if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
          const entry = item.webkitGetAsEntry()
          readEntry(entry)
        }
      }
    } else {
      resolve(dt.files)
    }

    function readEntry(entry, directory = "") {
      if (entry.isFile) {
        reading++
        entry.file(file => {
          reading--

          file.fullPath = `${directory}${file.name}`
          contents.push(file)

          if (reading === 0) {
            resolve(contents)
          }
        })
      } else if (entry.isDirectory) {
        const dir = {
          isDir: true,
          size: 0,
          fullPath: `${directory}${entry.name}`
        }

        contents.push(dir)

        readReaderContent(entry.createReader(), `${directory}${entry.name}`)
      }
    }

    function readReaderContent(reader, directory) {
      reading++

      reader.readEntries(function (entries) {
        reading--
        if (entries.length > 0) {
          for (const entry of entries) {
            readEntry(entry, `${directory}/`)
          }

          readReaderContent(reader, `${directory}/`)
        }

        if (reading === 0) {
          resolve(contents)
        }
      })
    }
  })
}

export function handleFiles(files, base, overwrite = false) {
  for (let i = 0; i < files.length; i++) {
    let id = store.state.upload.id
    let path = base
    let file = files[i]

    if (file.fullPath !== undefined) {
      path += url.encodePath(file.fullPath)
    } else {
      path += url.encodeRFC5987ValueChars(file.name)
    }

    if (file.isDir) {
      path += '/'
    }

    const item = {
      id,
      path,
      file,
      overwrite
    }

    store.dispatch('upload/upload', item);
  }
}